/*
 * $Id: JSPHelper.java 47 2012-02-20 14:30:14Z rook.alex@gmail.com $
 */
package ua.org.energy.vkek.site.web;

import com.google.appengine.api.datastore.KeyFactory;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.servlet.jsp.JspWriter;
import ua.org.energy.vkek.site.model.AbstractEntity;
import ua.org.energy.vkek.site.model.Article;
import ua.org.energy.vkek.site.model.ArticleCategory;
import ua.org.energy.vkek.site.model.ArticleTag;
import ua.org.energy.vkek.site.model.BaseEntity.EntityPathElement;
import ua.org.energy.vkek.site.server.ArticleUtils;
import ua.org.energy.vkek.site.server.CategoryUtils;
import ua.org.energy.vkek.site.server.EMF;
import ua.org.energy.vkek.site.server.TagUtils;

public class JSPHelper {

    public static final String INDEX_SUFFIX = "_index", //суффикс для тегов/статей которые отобразятся по умолчанию
            INDEX_DISPLAY_STRING = "индекс",
            INDEX_PAGE = "/index.jsp",
            ERROR_PAGE = "/error.jsp",
            SITE_PAGE = "/s/",
            CURRENT_LINK_CLASS = "current-link";//css class for current target link's

    public static Article findIndexArticle(ArticleCategory category) {
        return findIndexArticle(findIndexTag(category));
    }

    public static ArticleTag findIndexTag(ArticleCategory category) {
        if (category != null) {
            String indexTagName = getIndexName(category.getCategoryName());
            ArticleTag result = TagUtils.findArticleTag(indexTagName, EMF.getEM());
            if (result != null) {
                return result;
            } else {
                List<ArticleTag> list=category.getArticleTags();
                if ((list!=null)&&(!list.isEmpty())) {
                    result =list.get(0); //если нет тега с суффиксом _index - возвращается первый в списке для категории (если список не пуст)
                }
            }
            return result;

        } else {
            return null;
        }
    }

    public static Article findIndexArticle(ArticleTag tag) {
        if (tag != null) {
            String indexArticleTitle = getIndexName(tag.getTagName());
            Article result= ArticleUtils.findArticle(indexArticleTitle, EMF.getEM());
            if (result!=null) {
                return result;
            } else {
                List<Article> list=tag.getArticles();
                if ((list!=null)&&(!list.isEmpty())) {
                    result =list.get(0);  //если нет статьи с суффиксом _index - возвращается первая в списке для тега (если список не пуст)
                }
            }
            return result;
        } else {
            return null;
        }
    }

    public static String getIndexName(String prefix) {
        return (prefix + INDEX_SUFFIX);
    }

    public static boolean isIndexName(AbstractEntity entity) {
        if (entity instanceof Article) {
            String indexArticleTitle = getIndexName(((Article) entity).getTag().getTagName());
            return ((Article) entity).getArticleTitle().equals(indexArticleTitle);
        } else if (entity instanceof ArticleTag) {
            String indexTagName = getIndexName(((ArticleTag) entity).getCategory().getCategoryName());
            return ((ArticleTag) entity).getTagName().equals(indexTagName);
        } else {
            return false;
        }

    }

    /**
     * Печатает меню навигации (только теги li)
     *
     * @param out поток вывода
     * @param requestedCategory запрошенная категория (ТODO: сделать подсветку
     * запрошенной категории в меню)
     * @return возвращает первую (index) категорию сайта
     */
    public static ArticleCategory createNavBlock(JspWriter out,
            final ArticleCategory requestedCategory) throws IOException {

        CategoryUtils utils = new CategoryUtils(EMF.getEM());
        List<ArticleCategory> list = utils.listAll();
        int i = 0;
        ArticleCategory result = null;
        String cssclass;
        for (ArticleCategory cat : list) {
            i++;
            cssclass = (cat.equals(requestedCategory)) ? CURRENT_LINK_CLASS : "";
            if (i == 1) { //первая по списку категория будет отображатся на индексной странице
                cssclass = (requestedCategory == null) ? CURRENT_LINK_CLASS : "";
                out.println("<li>" + constructSiteHyperLink(cat, INDEX_PAGE, cssclass) + "</li>");
                result = cat;
            } else {
                out.println("<li>" + constructSiteHyperLink(cat, SITE_PAGE, cssclass) + "</li>");
            }
        }
        return result; //indexCategory
    }

    public static <T extends AbstractEntity> List<String> constructSiteHyperLinkList(List<T> list,
            AbstractEntity requestedEntity, String prefix,
            String linkCssClass, boolean printIndex) {
        if (list != null) {
            List<String> result = new ArrayList<String>(list.size());
            for (AbstractEntity ent : list) {
                String cssClass = (ent.equals(requestedEntity)) ? CURRENT_LINK_CLASS : linkCssClass;
                String a = constructSiteHyperLink(ent, prefix, cssClass);
                if ((isIndexName(ent)) && (printIndex)) {
                    result.add(a);
                } else if (!isIndexName(ent)) {
                    result.add(a);
                }

            }
            return result;
        } else {
            return null;
        }
    }

    public static String constructSiteHyperLink(AbstractEntity entity, String prefix, String linkCssClass) {
        if (entity == null) {
            return JSPHelper.ERROR_PAGE;
        }
        StringBuilder result;
        if ((linkCssClass != null) && (!linkCssClass.isEmpty())) {
            result = new StringBuilder("<a class=\"").append(linkCssClass).append("\" href=\"");
        } else {
            result = new StringBuilder("<a href=\"");
        }

        result.append(constructSiteHyperLinkHREF(entity, prefix)).append("\">"); // must be '<a href="....">'
        String displayName = constructDisplayName(entity);
        result.append(displayName).append("</a>");
        return result.toString();
    }

    public static String constructDisplayName(AbstractEntity entity) {
        return isIndexName(entity) ? INDEX_DISPLAY_STRING : entity.getPathElement().elName();
    }

    public static String constructSiteHyperLinkHREF(AbstractEntity entity, String prefix) {
        StringBuilder result = new StringBuilder();
        if (prefix.equalsIgnoreCase(JSPHelper.INDEX_PAGE)) {
            return JSPHelper.INDEX_PAGE;
        } else {
            result.append(prefix);
            for (EntityPathElement pathEl : entity.getEntityPath()) {
                result.append(KeyFactory.keyToString(pathEl.elKey())).append("/");
            }
            return result.toString();
        }
    }

    public static String getDateStr(Date date) {
        SimpleDateFormat df = new SimpleDateFormat("MMM,dd yyyy г. HH:mm", new Locale("ru", "UA"));
        return df.format(date);
    }

    public static String redSpan(String value) {
        StringBuilder result = new StringBuilder("<span style=\"color:red;\">");
        return result.append(value).append("</span>").toString();
    }

    public static String redSpan(Object value) {
        return value != null ? redSpan(value.toString()) : "null";

    }
}
